/**
 * 应用配置管理器
 * 
 * 用途：管理应用的所有配置参数，支持从配置文件加载和运行时修改
 * 方法：使用 Properties 文件和 SharedPreferences 结合的方式
 * 原理：优先使用 SharedPreferences 中的配置，如果没有则使用默认配置文件中的值
 */
package com.example.brain_wave.config

import android.content.Context
import android.content.SharedPreferences
import java.io.IOException
import java.util.Properties

class AppConfig private constructor(private val context: Context) {
    
    companion object {
        @Volatile
        private var INSTANCE: AppConfig? = null
        
        fun getInstance(context: Context): AppConfig {
            return INSTANCE ?: synchronized(this) {
                INSTANCE ?: AppConfig(context.applicationContext).also { INSTANCE = it }
            }
        }
    }
    
    private val sharedPrefs: SharedPreferences = 
        context.getSharedPreferences("app_config", Context.MODE_PRIVATE)
    
    /**
     * 动态加载配置文件
     * 每次获取配置时都会重新读取 config.properties 文件
     */
    private fun loadPropertiesFromAssets(): Properties {
        val properties = Properties()
        try {
            context.assets.open("config.properties").use { inputStream ->
                properties.load(inputStream)
            }
        } catch (e: IOException) {
            // 如果配置文件不存在，使用硬编码的默认值
            setDefaultValues(properties)
        }
        return properties
    }
    
    /**
     * 设置硬编码的默认值（作为后备方案）
     * 注意：这些值应该与config.properties文件中的默认值保持一致
     */
    private fun setDefaultValues(properties: Properties) {
        properties.apply {
            setProperty("api.base.url", "http://192.168.2.12:8000")
            setProperty("api.endpoint", "/api/tablet/brainwave/sync")
            setProperty("session.api.base.url", "http://192.168.2.12:9000")
            setProperty("session.api.endpoint", "/api/sessions/")
            setProperty("api.connect.timeout", "10")
            setProperty("api.write.timeout", "10")
            setProperty("api.read.timeout", "30")
            setProperty("data.collection.interval", "1000")
            setProperty("store.room.api.base.url", "http://139.224.62.63:81")
            setProperty("store.room.api.store.endpoint", "/admin/store/apiStores")
            setProperty("store.room.api.room.endpoint", "/admin/room/apiRooms")
            setProperty("store.room.api.token", "jsw2hSS8ypfheSX5")
            setProperty("store.room.api.server", "1")
            setProperty("data.cache.max.size", "300")
            setProperty("data.cache.max.time", "3600000")
            setProperty("ui.time.window.default", "30")
            setProperty("debug.enabled", "false")
        }
    }
    
    /**
     * 获取字符串配置
     * 动态从config.properties文件读取最新配置
     */
    fun getString(key: String, defaultValue: String? = null): String {
        // 优先级1: SharedPreferences（运行时设置）
        val prefValue = sharedPrefs.getString(key, null)
        if (prefValue != null) return prefValue
        
        // 优先级2: 动态加载config.properties文件
        val properties = loadPropertiesFromAssets()
        val propValue = properties.getProperty(key)
        if (propValue != null) return propValue
        
        // 优先级3: 传入的默认值
        return defaultValue ?: ""
    }
    
    /**
     * 获取整数配置
     * 动态从config.properties文件读取最新配置
     */
    fun getInt(key: String, defaultValue: Int = 0): Int {
        // 优先级1: SharedPreferences（运行时设置）
        val prefValue = sharedPrefs.getInt(key, Int.MIN_VALUE)
        if (prefValue != Int.MIN_VALUE) return prefValue
        
        // 优先级2: 动态加载config.properties文件
        val properties = loadPropertiesFromAssets()
        val propValue = properties.getProperty(key)
        propValue?.toIntOrNull()?.let { return it }
        
        // 优先级3: 传入的默认值
        return defaultValue
    }
    
    /**
     * 获取长整数配置
     * 动态从config.properties文件读取最新配置
     */
    fun getLong(key: String, defaultValue: Long = 0L): Long {
        // 优先级1: SharedPreferences（运行时设置）
        val prefValue = sharedPrefs.getLong(key, Long.MIN_VALUE)
        if (prefValue != Long.MIN_VALUE) return prefValue
        
        // 优先级2: 动态加载config.properties文件
        val properties = loadPropertiesFromAssets()
        val propValue = properties.getProperty(key)
        propValue?.toLongOrNull()?.let { return it }
        
        // 优先级3: 传入的默认值
        return defaultValue
    }
    
    /**
     * 获取布尔配置
     * 动态从config.properties文件读取最新配置
     */
    fun getBoolean(key: String, defaultValue: Boolean = false): Boolean {
        // 优先级1: SharedPreferences（运行时设置）
        if (sharedPrefs.contains(key)) {
            return sharedPrefs.getBoolean(key, defaultValue)
        }
        
        // 优先级2: 动态加载config.properties文件
        val properties = loadPropertiesFromAssets()
        val propValue = properties.getProperty(key)
        propValue?.toBoolean()?.let { return it }
        
        // 优先级3: 传入的默认值
        return defaultValue
    }
    
    /**
     * 设置字符串配置（运行时修改）
     */
    fun setString(key: String, value: String) {
        sharedPrefs.edit().putString(key, value).apply()
    }
    
    /**
     * 设置整数配置（运行时修改）
     */
    fun setInt(key: String, value: Int) {
        sharedPrefs.edit().putInt(key, value).apply()
    }
    
    /**
     * 设置长整数配置（运行时修改）
     */
    fun setLong(key: String, value: Long) {
        sharedPrefs.edit().putLong(key, value).apply()
    }
    
    /**
     * 设置布尔配置（运行时修改）
     */
    fun setBoolean(key: String, value: Boolean) {
        sharedPrefs.edit().putBoolean(key, value).apply()
    }
    
    /**
     * 重置配置到默认值
     */
    fun resetToDefaults() {
        sharedPrefs.edit().clear().apply()
    }
    
    // 便捷的配置访问属性
    val apiBaseUrl: String get() = getString("api.base.url")
    val apiEndpoint: String get() = getString("api.endpoint")
    val sessionApiBaseUrl: String get() = getString("session.api.base.url")
    val sessionApiEndpoint: String get() = getString("session.api.endpoint")
    val connectTimeout: Int get() = getInt("api.connect.timeout")
    val writeTimeout: Int get() = getInt("api.write.timeout")
    val readTimeout: Int get() = getInt("api.read.timeout")
    val dataCollectionInterval: Long get() = getLong("data.collection.interval")
    val debugEnabled: Boolean get() = getBoolean("debug.enabled")
    val defaultTimeWindow: Int get() = getInt("ui.time.window.default", 30)
    
    // 缓存配置属性
    val cacheMaxSize: Int get() = getInt("data.cache.max.size", 1000)
    val cacheMaxTime: Long get() = getLong("data.cache.max.time", 300_000L)
    
    // 门店房间 API 配置属性
    val storeRoomApiBaseUrl: String get() = getString("store.room.api.base.url")
    val storeApiEndpoint: String get() = getString("store.room.api.store.endpoint")
    val roomApiEndpoint: String get() = getString("store.room.api.room.endpoint")
    val storeRoomApiToken: String get() = getString("store.room.api.token")
    val storeRoomApiServer: String get() = getString("store.room.api.server")
}